home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Just Call Me Internet
/
Just Call Me Internet.iso
/
prog
/
atari
/
c
/
stut_src
/
datadirs.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-05-27
|
26KB
|
1,150 lines
/*
* datadirs.c
*
* Purpose:
* --------
* Gestion des "dossiers" virtuels du ramdisque virtuel!
*
* History:
* --------
* fplanque: Created
* 09.05.94: fplanque: les fichiers .h pour ressources avaient disparu
* lors de l'ajout de commentaires - remis en place.
*/
#include "!OPTIONS.H" /* Options de compilation */
#define THIS_FILE "DATADIRS.C v1.00 - 03.95"
/*
* System headers:
*/
#include <stdio.h> /* header standard */
#include <string.h> /* strcopy */
#include <ext.h> /* MAXPATH... */
#include <assert.h>
/*
* Custom headers:
*/
#include "SPEC_PU.H"
#include "S_MALLOC.H"
#include "AESDEF.H"
#include "DEBUG_PU.H"
#include "DATPG_PU.H"
#include "DTDIR_PU.H"
#include "DATAGRPS.H"
#include "OBJCT_PU.H"
/*
* ------------------------ VARIABLES -------------------------
*/
/*
* External variables:
*/
/*
* Icnes:
*/
extern OBJECT *G_desktop_adr; /* Ptr sur arbre bureau */
extern WIPARAMS *G_desk_params_adr; /* Paramtres de la "fentre bureau" */
/*
* Fentres
*/
extern WIPARAMS *G_wi_list_adr; /* Adresse de l'arbre de paramtres */
/*
* Fichiers:
*/
extern char G_filename[ 13 ]; /* Nom du fichier charger ex:TEST.TXT */
extern char G_filepath[ MAXPATH ]; /* Chemin du fichier charger ex:D\EXEMPLE */
/*
* Desktop:
*/
extern DATAGROUP * G_datagroups; /* Pointeur sur tableau de G_datagroups */
extern WIPARAMS * G_selection_adr; /* Slection courante */
/*
* Public variables:
*/
/*
* Private variables:
*/
/*
* ------------------------ FUNCTIONS -------------------------
*/
/*
* create_emptyDataDir(-)
*
* Purpose:
* --------
* Cre un DATADIR vide
*
* History:
* --------
* 1993: fplanque: Created
* 15.07.94: Init des ptrs sur DATAGOUP et DATADIR parent
*/
DATADIR * create_EmptyDataDir( /* Out: Ptr sur directory cr */
DATAGROUP * pDataGroup, /* In: Groupe dans lequel on cre ce dossier */
DATADIR * pDataDir_parent ) /* In: Directory parent de celui-ci */
{
/*
* Cre un emplacement mmoire pour ce dossier:
*/
DATADIR * new_dir = (DATADIR *) MALLOC( sizeof( DATADIR ) );
DATASTATE DataState;
/*
* Vrifie cohrence des paramtres:
*/
if( pDataDir_parent != NULL && pDataDir_parent -> pDataGroup != pDataGroup )
{
signale( "Incohrence DATAGROUP lors de la cration d'un DATADIR" );
}
/*
* Initialise pointeurs et variables du dossier:
*/
new_dir -> pDataGroup = pDataGroup;
new_dir -> pDataDir_parent = pDataDir_parent;
new_dir -> iconblks = NULL; /* Pas d'icnes! */
new_dir -> nb_elts = 0; /* Vide */
new_dir -> data_start = NULL; /* Vide */
new_dir -> data_end = NULL; /* Vide */
/*
* Pas d'infos complmentaires:
* Ces infos complmentaires ne sont utilises que par les dossiers ARBO
*/
new_dir -> dir_spec = NULL;
DataState .b_open = FALSE0; /* INUTILISE! */
DataState .sstate = SSTATE_EMPTY; /* tat: VIDE */
new_dir -> DataState = DataState;
new_dir -> nb_dirs = 0; /* Aucune fen DIR ouverte sur ces donnes */
new_dir -> nb_edits = 0; /* Aucune fen d'dition ouverte sur ces donnes */
/*
* Renvoie adresse du dossier vide:
*/
return new_dir;
}
/*
* DataDir_Destruct(-)
*
* Destruction d'un dtagroup VIDE
*
* 16.12.94: fplanque: Created
* 14.02.95: verified mallocs
*/
void DataDir_Destruct(
DATADIR * pDataDir ) /* In: Datadir dtruire */
{
assert( pDataDir -> iconblks == NULL );
assert( pDataDir -> dir_spec == NULL );
assert( pDataDir -> nb_elts == 0 );
/*
* Efface le datagroup:
*/
FREE( pDataDir );
}
/*
* dataDir_getSavState(-)
*
* Purpose:
* --------
* Indique si le DATADIR a t sauve ou non
*
* History:
* --------
* 06.08.94: fplanque: Created
* 08.08.94: gre les ptrs NULLs comme des dirs vierges
*/
SSTATE dataDir_getSavState( /* Out: Satut sauvegarde */
DATADIR * pDataDir ) /* In: Datadir concern */
{
if( pDataDir == NULL )
{ /*
* Dans le cas d'un dossier arbo vierge:
*/
return SSTATE_EMPTY;
}
else
{
return pDataDir -> DataState .sstate;
}
}
/*
* dataDir_setSavState(-)
*
* Purpose:
* --------
* Mmorise le fait que le DATADIR ait t sauve ou non
*
* Suggest:
* --------
* Implement recursivity:
*
* History:
* --------
* 07.08.94: fplanque: Created
* 02.10.94: en cas de SAVED: applique aux enfants du dir courant
*/
void dataDir_setSavState(
DATADIR * pDataDir, /* In: DATADIR concern */
SSTATE sstate, /* In: Etat */
BOOL b_GrafUpdate ) /* In: S'il faut faut rafficher les icne correspondantes... */
{
if( pDataDir -> DataState .sstate == sstate )
{ /*
* S'Il n'y a rien changer!
*/
return; /* On ne fera bien sur pas d'Update graphique.. (Time is Money :) */
}
/*
* Modifie tat de la page:
*/
pDataDir -> DataState .sstate = sstate;
/*
* Update graphique:
*/
if( b_GrafUpdate )
{
if( pDataDir -> pDataDir_parent != NULL )
{
signale( "Recursive DATADIRs not yet supported" );
}
else
{ /*
* Update de l'icone du DATAGROUP:
*/
int n_icone = pDataDir -> pDataGroup -> icon_no;
/*
* Modifie le caractre de l'icne:
*/
update_iconChar( &(G_desktop_adr[ n_icone ]), sstate );
/*
* Raffiche l'icne:
*/
redraw_icon( G_desk_params_adr, n_icone, n_icone, TAKE_CTRL );
}
}
/*
* Transmissions rcursives:
*/
switch( sstate )
{
case SSTATE_MODIFIED:
/*
* A FAIRE: Transmettre recursivement au parent si SSTATE_MODIFIED...
*/
break;
case SSTATE_SAVED:
{ /*
* On doit transmettre le statut saved tous les descendants:
*/
DATAPAGE * pDataPage;
for( pDataPage = pDataDir -> data_start;
pDataPage != NULL;
pDataPage = pDataPage -> next )
{ /*
* Update de la page mais pas de son dir (c'est dj fait ci-dessus)
*/
dataPage_chgSavState( pDataPage, SSTATE_SAVED, TRUE_1, FALSE0 );
}
}
break;
}
}
/*
* dataDir_UpdatePageIcon(-)
*
* Purpose:
* --------
* - update du char de l'icne d'aprs SSTATE de la page
* - raffiche une Icone de DataPage dans tous les datagroups o elle
* apparait.
*
* Suggest:
* --------
* Il faut repositionner le formulaire pour chaque fenetre
* ARBO TREE redessiner, en effet ces fenetres partagent un seul formulaire
*
* History:
* --------
* 11.08.94: fplanque: Transfered from dataPage_setSavState()
*/
void dataDir_UpdatePageIcon(
DATADIR * pDataDir, /* In: Dossier concern */
DATAPAGE * pDataPage ) /* In: DataPage concerne */
{
if ( pDataDir -> nb_dirs > 0 )
{ /*
* Si il y a une/des fentres ouvertes sur ce dossier:
* On va faire une update dans ces fentres:
*/
OBJECT * pObj_Tree;
int n_icone;
/*
* Trouve 1re fentre ou apparait le dossier:
*/
WIPARAMS * pWiParams = find_datawindow2( (unsigned long) pDataDir, G_wi_list_adr );
if( pWiParams == NULL )
{
signale( "Impossible de trouver une fentre correspondante" );
return;
}
/*
* Pointeur sur l'arbre d'objets reprsentant le directory:
*/
pObj_Tree = (pWiParams -> draw_ptr.tree);
/*
* Cherche la position de l'icne concerne:
*/
n_icone = find_iconByNamePtr( pObj_Tree, pDataPage -> nom );
if( n_icone == NIL_1 )
{
signale( "Impossible de trouver l'icne correspondante" );
return;
}
/*
* Modifie le caractre de l'icne:
*/
update_iconChar( &(pObj_Tree[ n_icone ]), dataPage_getSavState( pDataPage ) );
/*
* Raffiche l'icne dans la fentre courante:
*/
redraw_icon( pWiParams, n_icone, n_icone, TAKE_CTRL );
/*
* On s'occupe maintenant des autres fentres:
*/
/* printf( "Nb dirs = %d\n" , pDataDir -> nb_dirs ); */
if ( pDataDir -> nb_dirs > 1 )
{ /*
* S'il y a d'autres fenetres ouvertes sur le DATADIR,
* nous allons actualiser leur contenu maintenant!
* nous allons juste faire un redraw des icnes!
* En effet la structure des fentres DATADIRS est telle
* qu'elles partages toutes les mmes ICONBLKS: donc le
* caractre est dj mis jour.
*/
while( (pWiParams = find_datawindow2( (unsigned long) pDataDir, pWiParams -> next )) != NULL )
{ /*
* Tant qu'on a trouv une fentre ouverte sur ce dir:
* Pointeur sur l'arbre d'objets reprsentant le directory:
*/
pObj_Tree = (pWiParams -> draw_ptr.tree);
/*
* Cherche la position de l'icne concerne:
*/
n_icone = find_iconByNamePtr( pObj_Tree, pDataPage -> nom );
if( n_icone == NIL_1 )
{
signale( "Impossible de trouver l'icne correspondante" );
return;
}
/*
* Raffiche l'icne dans la fentre courante:
*/
redraw_icon( pWiParams, n_icone, n_icone, TAKE_CTRL );
}
}
}
}
/*
* dataDir_InsertStdDataPg(-)
*
* Purpose:
* --------
* Crer une nouvelle DATAPAGE
* portant le nom spcifi
* dans le DATADIR spcifi
* en effaant la page actuelle si elle existe dj !
*
* Algorythm:
* ----------
*
* Suggest:
* ------
* Update status modif
* Demande confirmation de l'crasement
*
* History:
* --------
* 06.07.94: fplanque: Created based on create_newDataPage()
* 02.09.94: ne prend plus de ptr sur datagroup, slt sur datadir
*/
DATAPAGE * dataDir_InsertStdDataPg(
const char * pS_name, /* In: Nom de la page crer */
DATADIR * pDataDir ) /* In: Datadir ds lequel on veut crer */
{
DATAGROUP * pDataGroup = pDataDir -> pDataGroup; /* Datagroup ds lequel on veut crer */
DATAPAGE * pDataPage; /* "Page" en cours de cration */
/*
* Type des donnes stocker ds DATAGROUP/DATAPAGE:
*/
DATATYPE DataType = pDataGroup -> DataType;
/*
* Vrifie que le nom est valide
*/
if ( pS_name == NULL )
{ /*
* Nom invalide:
*/
ping();
return NULL;
}
/*
* Si on a donn un nom valide:
* Teste si la page existe dj :
*/
pDataPage = page_adr_bynamecmp( pDataDir, pS_name );
if( pDataPage == NULL )
{ /*
* Page n'existe pas encore:
* Cre zone d'info DATAPAGE standard VIDE:INVALIDE
* remplir ds le retour de la fonction
*/
pDataPage = create_std_datapage( DataType, pS_name );
/*
* Relie la nlle "page" aux autres:
*/
attach_new_data( pDataDir, pDataPage );
}
else
{ /*
* Page existe dj :
* On efface son contenu:
*/
dataPg_resetdata( pDataPage );
}
return pDataPage;
}
/*
* attach_new_data(-)
*
* Purpose:
* --------
* Relie une nouvelle DATAPAGE aux autres d'un DATADIR
*
* Algorythm:
* ----------
* Recherche position partir de la fin
* pour optimiser temps de recherche lors du chargement d'un
* fichier o les pages sont dj dans l'ordre alphabtique
*
* Suggest:
* ------
* Mettre a ds un fichier de mthodes
*
* History:
* --------
* 1993: fplanque: Created
* 15.12.94: ptr de la page vers son datadir
* 09.04.95: insertion l o il faut (gestion alphabtique)
*/
void attach_new_data(
DATADIR * datadir, /* In: DATADIR dans lequel on ajoute une DATAPAGE */
DATAPAGE * new_data ) /* In: DATAPAGE a ajouter */
{
DATAPAGE * pDataPg_Curr = datadir -> data_end;
DATAPAGE * pDataPg_Next = NULL;
int n_comp;
while( pDataPg_Curr != NULL )
{ /*
* Tant qu'on est pas en 1re position:
*/
n_comp = strcmp( pDataPg_Curr -> nom, new_data -> nom );
if( n_comp == 0 )
{
signale( "Nom identiques!");
break;
}
else if( n_comp < 0 )
{
break;
}
/*
* On se dplace sur la page prcdente:
*/
pDataPg_Next = pDataPg_Curr;
pDataPg_Curr = pDataPg_Curr -> prev;
}
/*
* Ceci est la dernire page:
*/
/*
* On fait pointer la page sur son datadir:
*/
new_data -> pDataDir = datadir;
/*
* Liaison bidirectionnelle entre pageq:
*/
if( pDataPg_Next == NULL )
{ /*
* Si on ajoute la fin:
* (cas frquent lors du chargement)
*/
if( pDataPg_Curr == NULL )
{
new_data -> prev = NULL;
datadir -> data_start = new_data;
}
else
{
new_data -> prev = pDataPg_Curr;
pDataPg_Curr -> next = new_data;
}
new_data -> next = NULL;
datadir -> data_end = new_data;
}
else if( pDataPg_Curr == NULL )
{ /*
* Si on ajoute au dbut du groupe:
*/
new_data -> prev = NULL;
datadir -> data_start = new_data;
new_data -> next = pDataPg_Next;
pDataPg_Next -> prev = new_data;
}
else
{ /*
* Si on ajoute en milieu de groupe:
*/
new_data -> prev = pDataPg_Curr;
pDataPg_Curr -> next = new_data;
new_data -> next = pDataPg_Next;
pDataPg_Next -> prev = new_data;
}
/*
* 1 page en PLUS de celles qui existaient dj :
*/
(datadir -> nb_elts) ++;
}
/*
* clearout_datadir(-)
*
* Purpose:
* --------
* Supprime le contenu d'un DATADIR
*
* History:
* --------
* 1993: fplanque: Created
* 15.07.94: ne prend plus de param 'data_type'
* 26.12.94: update icone
*/
void clearout_datadir(
DATADIR * datadir ) /* In: DATADIR vider */
{
int i = 0;
DATAPAGE *curr_datapage = datadir -> data_start; /* Adr 1re page en mmoire */
DATAPAGE *next_datapage;
WIPARAMS *wi_adr; /* Fen d'dition associ la page qu'on efface en ce moment */
/*
* Efface les pages:
*/
while ( curr_datapage != NULL )
{ /*
* Tant qu'il y a des pages
*/
next_datapage = curr_datapage -> next;
i++;
if( dataPage_IsOpen( curr_datapage ) )
{ /*
* S'il y a une fentre d'dition ouverte:
*
* Trouve la fentre d'dition concerne
*/
wi_adr = find_datawindow2( (unsigned long) curr_datapage, G_wi_list_adr );
if ( wi_adr == NULL )
{
ping(); /* ANORMAL! */
}
else
{
ferme_fenetre( wi_adr, TRUE_1 ); /* Ferme la fentre */
}
}
/*
* Efface page:
*/
efface_page( curr_datapage );
curr_datapage = next_datapage;
}
/*
* Plus de page:
*/
datadir -> nb_elts = 0;
datadir -> data_start = NULL;
datadir -> data_end = NULL;
/*
* Signale que le datadir est vide:
*/
dataDir_setSavState( datadir, SSTATE_EMPTY, TRUE_1 );
}
/*
* efface_1data(-)
*
* Purpose:
* --------
* Efface 1 DATAPAGE d'un groupe de donnes:
* maj statut sauvegarde datadirs
*
* Notes:
* ------
*
* History:
* --------
* 1993: fplanque: Created
* 09.08.94: fplanque: chang valeur de retour
* 06.10.94: fplanque: rcup le datagrp directement ds le datadir
*/
BOOL efface_1data( /* Out: FALSE0 si pas modifie */
DATADIR * datadir, /* In: DATADIR ds lequel est situé la page */
DATAPAGE * rm_datapage ) /* In: DATAPAGE à effacer */
{
DATAGROUP * datagroup = datadir -> pDataGroup; /* DATAGROUP ds lequel on travaille */
static char *conf1 ="[2][|EFFACER la base de|donnes: 123456789012|de la mmoire?][Confirmer|Annuler]";
static char *conf2 ="[3][La base de donnes: 123456789012|est en cours d'DITION.|Voulez-vous l'FFACER|quand mme?][Confirmer|Voir|Annuler]";
char * replace; /* Remplacement de texte */
int pos_nom; /* Position du nom de la page */
DATATYPE type = datagroup -> DataType; /* Type de page a effacer */
int resultat; /* Destruction ou pas? */
DATAPAGE * prev_datapage = rm_datapage -> prev; /* Adr page prcdente */
DATAPAGE * next_datapage = rm_datapage -> next; /* Adr page suivante */
/*
* Vrifie que la page n'est pas en cours d'dition:
*/
if ( dataPage_IsOpen( rm_datapage ) )
{ /*
* S'il y a dj une fentre ouverte dessus:
* Demande conf:
* Fixe type:
*/
switch( type )
{
case DTYP_ARBO:
replace = "La page arbo: ";
pos_nom = 18;
break;
case DTYP_PAGES:
replace = "La page-cran: ";
pos_nom = 19;
break;
case DTYP_DATAS:
replace = "La base de donnes: ";
pos_nom = 24;
break;
case DTYP_TEXTS:
replace = "Le texte: ";
pos_nom = 14;
break;
case DTYP_PICS:
replace = "L'image: ";
pos_nom = 13;
break;
}
memcpy( conf2 + 4, replace , 32);
/*
* Fixe nom:
*/
memcpy( conf2 + pos_nom, rm_datapage -> nom, strlen( rm_datapage -> nom )); /* Copie nom */
/*
* Affiche alerte:
*/
resultat=form_alert( 2, conf2 ); /* Alerte */
/*
* Selon le rsultat:
*/
if( resultat != 3 ) /* Si on a pas annul: */
{ /*
* Trouve la fentre d'dition concerne
*/
WIPARAMS * wi_adr = find_datawindow2( (unsigned long) rm_datapage, G_wi_list_adr );
if ( wi_adr == NULL )
ping(); /* ANORMAL! */
else
{
if ( resultat == 1)
{ /*
* Si on choisi d'effacer le doc:
* On va commencer par fermer la fentre d'dition
*/
ferme_fenetre( wi_adr, TRUE_1 );
}
else
{ /*
* Si on veut voir le doc en question:
* On va le monter au 1er Plan:
*/
put_wi_on_top( wi_adr );
}
}
}
}
else
{ /*
* Si l'elt n'est pas en cours d'dition
* Demande conf:
* Fixe type:
*/
switch( type )
{
case DTYP_ARBO:
replace = "a page |arbo: ";
pos_nom = 30;
break;
case DTYP_PAGES:
replace = "a page |cran: ";
pos_nom = 31;
break;
case DTYP_DATAS:
replace = "a base de|donnes: ";
pos_nom = 33;
break;
case DTYP_TEXTS:
replace = "e texte: | ";
pos_nom = 24;
break;
case DTYP_PICS:
replace = "'image: | ";
pos_nom = 24;
break;
}
memcpy( conf1 + 14, replace , 31);
/*
* Fixe nom:
*/
memcpy( conf1 + pos_nom, rm_datapage -> nom, strlen( rm_datapage -> nom )); /* Copie nom */
/*
* Affiche alerte:
*/
resultat=form_alert( 2, conf1 ); /* Alerte */
}
if ( resultat != 1 )
{ /*
* Si on a annul l'effacement
*/
return FALSE0; /* Pas de modif (pas d'effacement) */
}
/* TRACE2( "Gonna erase DataPage: %lu %s", rm_datapage, rm_datapage-> nom ); */
/*
* Efface page:
*/
efface_page( rm_datapage );
/*
* Une page de moins:
*/
(datadir -> nb_elts)--;
/*
* Liens:
*/
/* Prc -> Suiv: */
if ( prev_datapage != NULL ) /* Si on a pas ffac la premire page */
{
prev_datapage -> next = next_datapage;
}
else /* Si on a effac la 1re page: */
{
datadir -> data_start = next_datapage;
}
/* Prc <- Suiv: */
if ( next_datapage != NULL ) /* Si on a pas ffac la dernire page */
{
next_datapage -> prev = prev_datapage;
}
else /* Si on a effac la dernire page: */
{
datadir -> data_end = prev_datapage;
}
/*
* Mise jour des fentres:
*/
if ( type != DTYP_ARBO )
{ /*
* Si on est pas sur une page arbo:
* On va metre jour la fentre:
* On considre qu'il y a au moins 1 fentre ouverte,
* Sinon on aurait pas pu effacer...
*/
remplace_dir( datadir );
}
/*
* Status mise jour:
*/
dataDir_setSavState( datadir, SSTATE_MODIFIED, TRUE_1 );
return TRUE_1; /* Modif effectue */
}
/*
* close_datawindows(-)
*
* Purpose:
* --------
* Ferme toutes les fentres d'un DATADIR
*
* Algorythm:
* ----------
* Parcourt la liste des fenetres a la recherche de celles qui
* affiche le DATAGROUP en question.
*
* History:
* --------
* 1993: fplanque: Created
*/
void close_datawindows(
DATADIR *datadir ) /* In: DATADIR dont on veut fermer les fenêtres */
{
/* Premire fen concerne: */
WIPARAMS *curr_wi_adr;
/* printf("Datadir:%lu nb_dirs=%d \n", datadir, datadir -> nb_dirs ); */
/* Fermeture: */
while
( /* Cherche 1re fen concerne dans la liste: */
/* (On cherche toujous la 1ERE car ds qu'on en ferme une, elle dgage de la liste, la suivante devient alors PREMIERE!) */
curr_wi_adr = find_datawindow2( (unsigned long) datadir, G_wi_list_adr ),
curr_wi_adr != NULL
)
{ /* Tant qu'on a trouv une fentre fermer: */
/* printf("Adr Fen concerne: %lX\n",curr_wi_adr); */
/* Ferme la fentre: */
ferme_fenetre( curr_wi_adr, TRUE_1 );
}
}
/*
* page_adr_byicno(-)
*
* Purpose:
* --------
* Trouve l'adresse d'une page en fonction de son no
*
* History:
* --------
* 1993: fplanque: Created
* 21.09.94: tests d'erreur
*/
DATAPAGE * page_adr_byicno( /* Out: Ptr sur la page trouvée */
DATADIR* datadir, /* In: DATADIR ds lequel se trouve la page */
int page_no ) /* In: No d'ordre de la page ds le groupe */
{
DATAPAGE *page_ptr = datadir -> data_start; /* Adr 1re page */
int i; /* Compteur */
if( page_no < 1 )
{
return NULL;
}
for
(
i = 1; /* Dbut en 1 */
i < page_no; /* Tant que pas au bon no */
i++, page_ptr = page_ptr -> next /* -> Passe page suivante */
)
{
if( page_ptr == NULL )
{
return NULL;
}
}
return page_ptr;
}
/*
* count_pages(-)
*
* Purpose:
* --------
* Compte le nombre de pages d'un DATADIR
*
* History:
* --------
* fplanque: Created
*/
int count_pages(
DATADIR *datadir ) /* In: DATADIR dont on veut compter les pages */
{
DATAPAGE *page_ptr = datadir -> data_start; /* Adr 1re page */
int nb_pages = 0; /* Compteur */
while ( page_ptr != NULL )
{
nb_pages ++; /* 1 page de plus */
page_ptr = page_ptr -> next; /* Passe sur la page suivante */
};
return nb_pages;
}
/*
* page_adr_byname(-)
*
* Purpose:
* --------
* Trouve l'adresse d'une page d'aprs son nom
*
* Algorythm:
* ----------
* Cette routine compare juste les pointeurs!
* (utilise dans l'dition arbo)
*
* Notes:
* ------
* Ceci est rapide mais dangereux! On peut mal utiliser cette fonction.
* Une autre ci-dessous, fait une comparaison relle
*
* History:
* --------
* 1993: fplanque: Created
*/
DATAPAGE * page_adr_byname(
DATADIR *datadir,
char *name )
{
DATAPAGE *page_ptr = datadir -> data_start; /* Adr 1re page */
/* TRACE2( "Datadir=%lu Page=%s", datadir, name); */
while ( page_ptr != NULL )
{
/* TRACE1( "Found=%s", page_ptr -> nom ); */
if( page_ptr -> nom == name )
{
break;
}
page_ptr = page_ptr -> next;
}
/* TRACE0( "End search" ); */
if( page_ptr == NULL )
{
ping();
TRACE1( "Page %s non trouve", name );
}
return page_ptr;
}
/*
* page_adr_bynamecmp(-)
*
* Purpose:
* --------
* Cette routine, plus lente,
* trouvera la page mme si on lui fourni
* une copie du nom, (adr mmoire diffrente)
*
* Algorythm:
* ----------
* Cette routine compare donc rellement les 2 chaines nom
*
* Notes:
* ------
* Voir aussi la fonction qui compare les pointeurs
*
* History:
* --------
* 1993: fplanque: Created
*/
DATAPAGE * page_adr_bynamecmp( /* Out: Ptr sur DATAPAGE, NULL si pas trouv */
DATADIR * datadir, /* In: DATADIR ds lequel on doit chercher la page */
const char * name ) /* In: Nom de la page qu'on recherche */
{
DATAPAGE *page_ptr = datadir -> data_start; /* Adr 1re page */
while ( page_ptr != NULL && strcmp( (page_ptr -> nom), name ) != 0 )
{
page_ptr = page_ptr -> next;
}
return page_ptr;
}
/*
* page_fullpath(-)
*
* Purpose:
* --------
* Cre le chemin d'accs complet une page
*
* Algorythm:
* ----------
* Operations sur chaines de caractres:
*
* Notes:
* ------
* Cette fonction suppose que la page est dans le root
*
* History:
* --------
* 1994: fplanque: Created
* 14.12.94: prend DATADIR en param
*/
char * page_fullpath(
DATADIR * pDataDir, /* In: DATADIR ds lequel doit se trouver la page */
char * name ) /* In: Nom de la page */
{
DATAGROUP * pDataGrp = pDataDir -> pDataGroup;
size_t length = strlen( pDataGrp -> data_device ) +1 /* le '\' */
+ strlen( name ) + 1; /* Longueur */
char *fullpath = (char *) MALLOC( length );
/*
* Cration path:
*/
strcpy( fullpath, pDataGrp -> data_device ); /* Copie ROOT */
strcat( fullpath, "\\" ); /* Ajoute backslash */
strcat( fullpath, name ); /* Ajoute NOM */
return fullpath;
}
char * page_fullpath_old(
DATAGROUP * pDataGrp, /* In: DATAGROUP ds lequel doit se trouver la page */
char * name ) /* In: Nom de la page */
{
size_t length = strlen( pDataGrp -> data_device ) +1 /* le '\' */
+ strlen( name ) + 1; /* Longueur */
char *fullpath = (char *) MALLOC( length );
/*
* Cration path:
*/
strcpy( fullpath, pDataGrp -> data_device ); /* Copie ROOT */
strcat( fullpath, "\\" ); /* Ajoute backslash */
strcat( fullpath, name ); /* Ajoute NOM */
return fullpath;
}